package br.usp.ime.ingpos.testes.services;

import java.util.Date;
import java.util.List;

import org.junit.Test;

import br.usp.ime.ingpos.modelo.CEP;
import br.usp.ime.ingpos.modelo.CedulaDeIdentidade;
import br.usp.ime.ingpos.modelo.DadosPessoais;
import br.usp.ime.ingpos.modelo.Endereco;
import br.usp.ime.ingpos.modelo.Perfil;
import br.usp.ime.ingpos.modelo.TipoCedulaDeIdentidade;
import br.usp.ime.ingpos.modelo.TipoEstadoCivil;
import br.usp.ime.ingpos.modelo.TipoPais;
import br.usp.ime.ingpos.modelo.TipoPerfil;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.modelo.dao.UsuarioDao;
import br.usp.ime.ingpos.services.UsuarioService;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;
import br.usp.ime.ingpos.web.controllers.UsuarioSessao;

public class UsuarioServiceTeste extends BancoDeDadosTestCase {

	public UsuarioServiceTeste(String name) {
		super(name);
	}

	@Test
	public void testAutenticarEDesautenticar() {
		final UsuarioService usuarioService = new UsuarioService(
				new UsuarioDao(getSessionCreator()), new UsuarioSessao());

		assertTrue(usuarioService.autenticar(
				RegistroNovoUsuarioServiceTeste.EMAIL,
				RegistroNovoUsuarioServiceTeste.SENHA));
		
		assertTrue(usuarioService.isUsuarioAutenticado());
		
		usuarioService.deautenticate();
		assertFalse(usuarioService.isUsuarioAutenticado());
	}

	@Test
	public void testCadastrarDadosPessoais() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final Usuario usuario = usuarioDao
				.procurarPorEmail(RegistroNovoUsuarioServiceTeste.EMAIL);

		assertNotNull(usuario);

		final UsuarioSessao usuarioSessao = new UsuarioSessao();
		usuarioSessao.setUsuario(usuario);
		assertTrue(usuarioSessao.isUsuarioAutenticado());

		final CedulaDeIdentidade cedulaDeIdentidade = new CedulaDeIdentidade();
		cedulaDeIdentidade.setTipo(TipoCedulaDeIdentidade.RG);
		cedulaDeIdentidade.setNumero("45645655");

		final CEP cep = new CEP();
		cep.setCep("12345000");

		final DadosPessoais dadosPessoais = usuario.getDadosPessoais();

		// Comentado pois o email, cpf e senha por enquanto nao devem ser
		// alterados
		// dadosPessoais.setCpf( RegistroNovoUsuarioServiceTeste.CPF );
		// dadosPessoais.setEmail( RegistroNovoUsuarioServiceTeste.EMAIL );
		// dadosPessoais.setSenha( RegistroNovoUsuarioServiceTeste.SENHA );
		dadosPessoais.setEstadoCivil(TipoEstadoCivil.SOLTEIRO);
		dadosPessoais.setNacionalidade(TipoPais.ALBANIA);
		dadosPessoais.setDataDeNascimento(new Date(88 / 12 / 10));
		dadosPessoais.setNomeCompleto("Andre Roberto");
		dadosPessoais.setCedulaDeIdentidade(cedulaDeIdentidade);
		dadosPessoais.setEnderecoCorrespondencia(new Endereco());
		dadosPessoais.setEnderecoPermanente(new Endereco());

		final UsuarioService usuarioService = new UsuarioService(usuarioDao,
				usuarioSessao);
		usuarioService.cadastrarDadosPessoais(usuario, dadosPessoais);

		assertEquals(usuario.getDadosPessoais().getCpf(),
				dadosPessoais.getCpf());
		assertEquals(usuario.getDadosPessoais().getEstadoCivil(),
				dadosPessoais.getEstadoCivil());
		assertEquals(usuario.getDadosPessoais().getNacionalidade(),
				dadosPessoais.getNacionalidade());
		assertEquals(usuario.getDadosPessoais().getDataDeNascimento(),
				dadosPessoais.getDataDeNascimento());
		assertEquals(usuario.getDadosPessoais().getNomeCompleto(),
				dadosPessoais.getNomeCompleto());
		assertEquals(usuario.getDadosPessoais().getCedulaDeIdentidade(),
				dadosPessoais.getCedulaDeIdentidade());
		assertEquals(usuario.getDadosPessoais().getEnderecoCorrespondencia(),
				dadosPessoais.getEnderecoCorrespondencia());
		assertEquals(usuario.getDadosPessoais().getEnderecoPermanente(),
				dadosPessoais.getEnderecoPermanente());

		assertFalse(usuarioService.dadosPessoaisFinalizados());
	}

	@Test
	public void testCadastrarDadosPessoaisPersistencia() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final Usuario usuario = usuarioDao
				.procurarPorEmail(RegistroNovoUsuarioServiceTeste.EMAIL);

		assertNotNull(usuario);

		final CedulaDeIdentidade cedulaDeIdentidade = new CedulaDeIdentidade();
		cedulaDeIdentidade.setTipo(TipoCedulaDeIdentidade.RG);
		cedulaDeIdentidade.setNumero("45645655");

		assertEquals(usuario.getDadosPessoais().getEstadoCivil(),
				TipoEstadoCivil.SOLTEIRO);
		assertEquals(usuario.getDadosPessoais().getNacionalidade(),
				TipoPais.ALBANIA);
		assertEquals(usuario.getDadosPessoais().getDataDeNascimento(),
				new Date(88 / 12 / 10));
		assertEquals(usuario.getDadosPessoais().getNomeCompleto(),
				"Andre Roberto");

		assertEquals(usuario.getDadosPessoais().getCedulaDeIdentidade()
				.getNumero(), cedulaDeIdentidade.getNumero());
		assertEquals(usuario.getDadosPessoais().getCedulaDeIdentidade()
				.getTipo(), cedulaDeIdentidade.getTipo());
	}

	@Test
	public void testListaUsuarios() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final UsuarioSessao usuarioSessao = new UsuarioSessao();
		final UsuarioService usuarioService = new UsuarioService(usuarioDao,
				usuarioSessao);

		List<Usuario> usuarios = usuarioService.listaTodos();
		assertNotNull(usuarios);
		assertFalse(usuarios.isEmpty());
		assertNotNull(usuarios.get(0));
	}

	@Test
	public void testAutenticarUsuarioInvalido() {
		final UsuarioDao usuarioDao = new UsuarioDao(getSessionCreator());
		final UsuarioSessao usuarioSessao = new UsuarioSessao();
		final UsuarioService usuarioService = new UsuarioService(usuarioDao,
				usuarioSessao);

		assertFalse(usuarioService
				.autenticar("emailinvalido@teste.br", "senha"));
	}

	
}
